Transaction Management কি?
Transaction Management ডেটাবেস অপারেশন বা কোনো নির্দিষ্ট ক্রিয়ার একটি পূর্ণ প্রক্রিয়া নিশ্চিত করে যা সফলভাবে সম্পন্ন হয় বা পুরোপুরি বাতিল হয়ে যায়। এটি নিশ্চিত করে যে একটি অ্যাপ্লিকেশন বা সিস্টেমের যেকোনো পরিবর্তন সঠিকভাবে সম্পন্ন হচ্ছে এবং কোনো অর্ধেক পরিবর্তন (অর্থাৎ, যেগুলি পুরোপুরি সম্পন্ন হয়নি) ডেটাবেসে অন্তর্ভুক্ত না হয়। Transactional Management ডেটাবেস সিস্টেমের ACID (Atomicity, Consistency, Isolation, Durability) গুণাবলী নিশ্চিত করার জন্য ব্যবহৃত হয়।
স্প্রিং ফ্রেমওয়ার্কে ট্রানজেকশন ব্যবস্থাপনা প্রধানত দুটি পদ্ধতিতে পরিচালিত হয়:
- Declarative Transaction Management
- Programmatic Transaction Management
১. Declarative Transaction Management
Declarative Transaction Management হল স্প্রিং এর সবচেয়ে জনপ্রিয় ট্রানজেকশন ব্যবস্থাপনা পদ্ধতি। এই পদ্ধতিতে, @Transactional অ্যানোটেশন ব্যবহার করে ট্রানজেকশন পরিচালনা করা হয়। স্প্রিং কন্টেইনার এই অ্যানোটেশনটি স্বয়ংক্রিয়ভাবে প্রক্রিয়া করে, এবং যখন একটি মেথডে @Transactional অ্যাপ্লাই করা হয়, তখন স্প্রিং সেই মেথডের মধ্যে সব ডেটাবেস অপারেশনকে একটি ট্রানজেকশনে সংযুক্ত করে।
উদাহরণ:
TransactionService.java:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class TransactionService {
@Autowired
private AccountRepository accountRepository;
@Transactional
public void transferMoney(Long fromAccountId, Long toAccountId, double amount) {
Account fromAccount = accountRepository.findById(fromAccountId).get();
Account toAccount = accountRepository.findById(toAccountId).get();
fromAccount.setBalance(fromAccount.getBalance() - amount);
toAccount.setBalance(toAccount.getBalance() + amount);
accountRepository.save(fromAccount);
accountRepository.save(toAccount);
}
}
ব্যাখ্যা:
@Transactional: এই অ্যানোটেশনটি মেথড বা ক্লাস স্তরে ট্রানজেকশন ব্যবস্থাপনা কার্যকরী করে।- যখন
transferMoney()মেথড কল করা হয়, স্প্রিং এটি একটি একক ট্রানজেকশনে আটকে রাখবে। যদি কোনো কারণে মেথডটি ব্যর্থ হয়, সমস্ত পরিবর্তন রোলব্যাক হবে এবং ডেটাবেসের অবস্থা আগের মতো থাকবে।
application.properties কনফিগারেশন:
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
spring.datasource.username=root
spring.datasource.password=root
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL8Dialect
২. Programmatic Transaction Management
Programmatic Transaction Management পদ্ধতিতে, ট্রানজেকশন পরিচালনা কোডের মাধ্যমে করা হয়, অর্থাৎ ম্যানুয়ালি ট্রানজেকশন শুরু, কমিট, বা রোলব্যাক করা হয়। এটি স্প্রিং এর PlatformTransactionManager এবং TransactionDefinition ক্লাসগুলির মাধ্যমে সম্পন্ন হয়।
উদাহরণ:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionDefinition;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.DefaultTransactionDefinition;
@Service
public class ProgrammaticTransactionService {
@Autowired
private AccountRepository accountRepository;
@Autowired
private PlatformTransactionManager transactionManager;
public void transferMoney(Long fromAccountId, Long toAccountId, double amount) {
// Transaction definition
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
def.setIsolationLevel(TransactionDefinition.ISOLATION_SERIALIZABLE);
def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);
// Start transaction
TransactionStatus status = transactionManager.getTransaction(def);
try {
Account fromAccount = accountRepository.findById(fromAccountId).get();
Account toAccount = accountRepository.findById(toAccountId).get();
fromAccount.setBalance(fromAccount.getBalance() - amount);
toAccount.setBalance(toAccount.getBalance() + amount);
accountRepository.save(fromAccount);
accountRepository.save(toAccount);
// Commit transaction
transactionManager.commit(status);
} catch (Exception e) {
// Rollback transaction in case of error
transactionManager.rollback(status);
throw e;
}
}
}
ব্যাখ্যা:
PlatformTransactionManager: এটি স্প্রিং এর ইন্টারফেস যা ট্রানজেকশন পরিচালনা করতে ব্যবহৃত হয়।TransactionDefinition: এটি ট্রানজেকশনের আচরণ নির্ধারণ করে, যেমনISOLATIONএবংPROPAGATION।DefaultTransactionDefinition: এটিTransactionDefinitionএর একটি সাধারণ বাস্তবায়ন, যা ট্রানজেকশন সেটিংস কনফিগার করতে সহায়ক।getTransaction(),commit(), এবংrollback()মেথডগুলি ট্রানজেকশন ম্যানেজমেন্ট পরিচালনা করে।
এই পদ্ধতিতে, আপনি ট্রানজেকশন শুরু, কমিট এবং রোলব্যাক কোডের মাধ্যমে ম্যানুয়ালি করতে পারেন।
Declarative vs Programmatic Transaction Management
| বিশেষত্ব | Declarative Transaction Management | Programmatic Transaction Management |
|---|---|---|
| উপস্থিতি | @Transactional অ্যানোটেশন ব্যবহার করে | PlatformTransactionManager এবং TransactionDefinition ব্যবহার করে |
| সহজ ব্যবহার | সহজ, কম কোড লেখা লাগে | বেশি কোড লেখার প্রয়োজন |
| ফ্লেক্সিবিলিটি | কম, অ্যানোটেশন ব্যবহার করে প্রোগ্রামিং কমপ্লেক্সিটি কমানো হয় | বেশি, কোডে সম্পূর্ণ নিয়ন্ত্রণ পাওয়া যায় |
| ব্যবহার | সাধারণ CRUD অপারেশন এবং ট্রানজেকশনের জন্য উপযুক্ত | যেখানে উচ্চ স্তরের কাস্টমাইজেশন প্রয়োজন |
সারাংশ
Spring Transaction Management অ্যাপ্লিকেশনের ডেটাবেস অপারেশনগুলিকে কার্যকরীভাবে পরিচালনা করে এবং ACID গুণাবলী বজায় রাখে। স্প্রিং Declarative Transaction Management (যেমন @Transactional অ্যানোটেশন) এবং Programmatic Transaction Management (যেমন PlatformTransactionManager) উভয় পদ্ধতিতে ট্রানজেকশন পরিচালনা করার সুবিধা প্রদান করে।
Declarative Transaction Management বেশি ব্যবহারযোগ্য, কারণ এটি কোডের মধ্যে এক্সপ্রেসিভলি কমপ্লেক্সিটি কমায় এবং স্প্রিং কন্টেইনার দ্বারা স্বয়ংক্রিয়ভাবে পরিচালিত হয়, যেখানে Programmatic Transaction Management বেশি কাস্টমাইজেশন এবং নিয়ন্ত্রণ প্রদান করে, কিন্তু বেশি কোড লেখা প্রয়োজন।
Read more